/**
 * @file    elog_port.c
 * @brief   EasyLogger移植层实现文件
 * @details 本文件实现了EasyLogger在STM32F103平台上的移植层接口，包括：
 *          - 移植层初始化和反初始化
 *          - 底层日志输出接口实现
 *          - 输出锁定和解锁控制
 *          - 时间信息获取接口
 *          - 进程和线程信息获取接口
 */

#include "elog.h"
#include <stdio.h>
#include <string.h>
#include "./BSP/RTC/bsp_rtc.h"      /* RTC驱动头文件 */

/* ---------------------------------- 移植层初始化 ------------------------------------ */
/**
 * @brief  EasyLogger移植层初始化
 * @return 初始化结果
 * @retval ELOG_NO_ERR 初始化成功
 */
ElogErrCode elog_port_init(void)
{
    ElogErrCode result = ELOG_NO_ERR;                       /* 初始化结果 */

    /* 在此添加硬件相关初始化代码 */
    
    return result;
}

/**
 * @brief  EasyLogger移植层反初始化
 */
void elog_port_deinit(void)
{
    /* 在此添加硬件相关反初始化代码 */
}

/* ---------------------------------- 日志输出接口 ------------------------------------ */
/**
 * @brief  日志输出接口函数
 * @param  log 日志内容指针
 * @param  size 日志内容长度
 */
void elog_port_output(const char *log, size_t size)
{
    /* 在此添加实际的输出代码 */
    printf("%.*s", size, log);                              /* 通过printf输出日志 */
}

/* ----------------------------------- 输出锁控制 ------------------------------------- */
/**
 * @brief  输出锁定函数
 */
void elog_port_output_lock(void)
{
    /* 在此添加锁定代码 */
     __disable_irq();                                       /* 关闭全局中断 */
}

/**
 * @brief  输出解锁函数
 */
void elog_port_output_unlock(void)
{
    /* 在此添加解锁代码 */
    __enable_irq();                                         /* 开启全局中断 */
}

/* ----------------------------------- 时间信息获取 ----------------------------------- */
/**
 * @brief  获取当前时间字符串
 * @return 时间字符串指针
 */
const char *elog_port_get_time(void)
{
    static char time_str[16] = {0};     /* 静态时间字符串缓冲区 */
    
    /* 获取RTC当前时间 */
    rtc_get_time();
    
    /* 格式化时间字符串 HH:MM:SS */
    snprintf(time_str, sizeof(time_str), "%02d:%02d:%02d", 
             calendar.hour, calendar.min, calendar.sec);
    
    return time_str;
}

/* ----------------------------------- 进程线程信息 ----------------------------------- */
/**
 * @brief  获取当前进程信息
 * @return 进程信息字符串指针
 */
const char *elog_port_get_p_info(void)
{
    static char proc_str[16] = {0};     /* 静态进程信息字符串缓冲区 */
    
    /* STM32单片机系统，显示系统标识信息 */
    snprintf(proc_str, sizeof(proc_str), "STM32F103");
    
    return proc_str;
}

/**
 * @brief  获取当前线程信息
 * @return 线程信息字符串指针
 */
const char *elog_port_get_t_info(void)
{
#ifdef USING_FREERTOS
    static char task_str[32] = {0};     /* 静态任务信息字符串缓冲区 */
    
    /* 如果使用FreeRTOS，获取当前任务名 */
    TaskHandle_t current_task = xTaskGetCurrentTaskHandle();
    const char *task_name = pcTaskGetName(current_task);
    
    snprintf(task_str, sizeof(task_str), "task:%s", task_name);
    return task_str;
#else
    /* 裸机系统，显示主循环标识 */
    return "main";
#endif
}
